﻿using KhoaLuan.Areas.Admin.ActionFilters;
using KhoaLuan.Areas.Admin.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace KhoaLuan.Areas.Admin.Controllers
{
    [Security]
    public class ThongKeController : Controller
    {
        //
        // GET: /Admin/ThongKe/
        LuanVanEntities db = new LuanVanEntities();

        public ActionResult SearchProduct(DateTime? Min = null, DateTime? Max = null)
        {
            if (Min == null)
            {
                Min = DateTime.MinValue;
            }
            if (Max == null)
            {
                Max = DateTime.MaxValue;
            }

            var model = db.OrderDetails
                .Where(d => d.Order.OrderDate >= Min && d.Order.OrderDate <= Max)
                .GroupBy(d => d.Product)
                .Select(g => new ReportInfo
                {
                    Group = g.Key.Name,
                    Sum = g.Sum(d => d.UnitPrice * d.Quantity * (1 - d.Discount)),
                    Count = g.Sum(d => d.Quantity),
                    Min = g.Min(d => d.UnitPrice),
                    Max = g.Max(d => d.UnitPrice),
                    Avg = g.Average(d => d.UnitPrice)
                });
            return View("Index", model);
        }

        public ActionResult Index()
        {
            return View();
        }
        public ActionResult byProduct()
        {
            ViewBag.Title = "Doanh Số Từng Mặt Hàng";
            ViewBag.Group = "Hàng Hóa";
            var list = db.OrderDetails.GroupBy(d => d.Product)
                .Select(g => new ReportInfo
            {
                Group = g.Key.Name,
                Sum =g.Sum(d=>d.UnitPrice * d.Quantity *(1-d.Discount)),
                Count = g.Sum(d=>d.Quantity),
                Min = g.Min(d=>d.UnitPrice),
                Max =g.Max(d=>d.UnitPrice),
                Avg =g.Max(d=>d.UnitPrice),
            });
            return View("Index",list);
        }
        public ActionResult byCategory()
        {
            ViewBag.Title = "Doanh số từng loại";
            ViewBag.Group = "Loại hàng";
            var list = db.OrderDetails.GroupBy(d => d.Product.Category).Select(
                g => new ReportInfo
                {
                    Group = g.Key.Link,
                    Sum = g.Sum(d => d.UnitPrice * d.Quantity * (1 - d.Discount)),
                    Count = g.Sum(d => d.Quantity),
                    Min = g.Min(d => d.UnitPrice),
                    Max = g.Max(d => d.UnitPrice),
                    Avg = g.Average(d => d.UnitPrice)
                });
            return View("Index", list);
        }

        public ActionResult bySupplier()
        {
            ViewBag.Title = "Doanh số từng hãng";
            ViewBag.Group = "Hãng SX";
            var list = db.OrderDetails.GroupBy(d => d.Product.Supplier).Select(
                g => new ReportInfo
                {
                    Group = g.Key.Name,
                    Sum = g.Sum(d => d.UnitPrice * d.Quantity * (1 - d.Discount)),
                    Count = g.Sum(d => d.Quantity),
                    Min = g.Min(d => d.UnitPrice),
                    Max = g.Max(d => d.UnitPrice),
                    Avg = g.Average(d => d.UnitPrice)
                });
            return View("Index", list);
        }
        public ActionResult byCustomer()
        {
            ViewBag.Title = "Doanh số từng khách hàng";
            ViewBag.Group = "Khách hàng";
            var list = db.OrderDetails.GroupBy(d => d.Order.Customer).Select(
                g => new ReportInfo
                {
                    Group = g.Key.Fullname,
                    Sum = g.Sum(d => d.UnitPrice * d.Quantity * (1 - d.Discount)),
                    Count = g.Sum(d => d.Quantity),
                    Min = g.Min(d => d.UnitPrice),
                    Max = g.Max(d => d.UnitPrice),
                    Avg = g.Average(d => d.UnitPrice)
                });
            return View("Index", list);
        }
        public ActionResult byYear()
        {
            ViewBag.Title = "Doanh Số của từng năm ";
            ViewBag.Group = "Năm";
            var list = db.OrderDetails
                .GroupBy(d => d.Order.OrderDate.Year).Select(
                g => new ReportInfo
                {
                    IGroup = g.Key,
                    Sum = g.Sum(d => d.UnitPrice * d.Quantity * (1 - d.Discount)),
                    Count = g.Sum(d => d.Quantity),
                    Min = g.Min(d => d.UnitPrice),
                    Max = g.Max(d => d.UnitPrice),
                    Avg = g.Average(d => d.UnitPrice)
                })
             .OrderByDescending(r => r.IGroup);
            return View("Index", list);
        }
        public ActionResult byMohth()
        {
            ViewBag.Title = "Doanh số từng tháng";
            ViewBag.Group = "Tháng";
            var list = db.OrderDetails.GroupBy(d => d.Order.OrderDate.Month).Select(
                g => new ReportInfo
                {
                    IGroup = g.Key,
                    Sum = g.Sum(d => d.UnitPrice * d.Quantity * (1 - d.Discount)),
                    Count = g.Sum(d => d.Quantity),
                    Min = g.Min(d => d.UnitPrice),
                    Max = g.Max(d => d.UnitPrice),
                    Avg = g.Average(d => d.UnitPrice)
                })
                .OrderByDescending(r => r.IGroup);
            return View("Index", list);
        }

        public ActionResult byQuarter()
        {
            ViewBag.Title = "Doanh số từng quí";
            ViewBag.Group = "Quí";
            var list = db.OrderDetails.GroupBy(d => (int)Math.Ceiling(d.Order.OrderDate.Month / 3.0)).Select(
                g => new ReportInfo
                {
                    IGroup = g.Key,
                    Sum = g.Sum(d => d.UnitPrice * d.Quantity * (1 - d.Discount)),
                    Count = g.Sum(d => d.Quantity),
                    Min = g.Min(d => d.UnitPrice),
                    Max = g.Max(d => d.UnitPrice),
                    Avg = g.Average(d => d.UnitPrice)
                })
                .OrderBy(r => r.IGroup);
            return View("Index", list);
        }
   
	}
}